/* let a = { n: 10 };
let b = a;
a.x = a = { n: 20 };
console.log(a.x);
console.log(b);  */

/* let a = 0,
    b = 0;
let A = function (a) {
    A = function (b) {
        alert(a + b++);
    };
    alert(a++);
};
A(1);
A(2); */

//==========================
/*
 “var”不会产生私有块级上下文，本案中的“i”是全局变量
    第一轮：i=0
      setTimeout(function(){...}, 1000);
      i++;
    第二轮：i=1
      setTimeout(function(){...}, 2000);
      i++;
    ...
    第五轮：i=4
      setTimeout(function(){...}, 5000);
      i++;
    循环结束
      全局“i”等于5
      之前设置的定时器还没有执行，需要等待1000ms~5000ms

  定时器到时间，打算开始执行对应的函数
    function () { console.log(i); }
    + 此时输出的i不是函数中私有的
    + 输出的是全局的i
 */
/* for (var i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    }, (i + 1) * 1000);
} */

/* 
解决办法：利用闭包的机制 
  每一轮循环都产生一个闭包（私有上下文），闭包中有一个私有变量i，分别存储0~4
  第一轮：全局i=0
    (function (i) {
        // 私有上下文：私有i=0
        setTimeout(function(){
            console.log(i);
        }, 1000);
    })(0);
    i++;
  第二轮：全局i=1
    (function (i) {
        // 私有上下文：私有i=1
        setTimeout(function(){...}, 2000);
    })(1);
    i++;
  ...
  第五轮：全局i=4
    (function (i) {
        // 私有上下文：私有i=4
        setTimeout(function(){
            console.log(i);
        }, 5000);
    })(4);
    i++;
  循环结束
    全局i是5
    产生5个闭包，每个闭包中都有私有的i，分别存储0~4「闭包1~5」
*/
/* for (var i = 0; i < 5; i++) {
    (function (i) {
        setTimeout(function () {
            console.log(i);
        }, (i + 1) * 1000);
    })(i);
} */

/* 
// 原理和上面是一样的：for循环中出现let，则每一轮循环都可以创建一个闭包
for (let i = 0; i < 5; i++) {
    setTimeout(function () {
        console.log(i);
    }, (i + 1) * 1000);
} 
*/

/* // setTimeout([callback],[interval],...[params])
// 第三个及以后参数，都是给callback传递的值「当定时器到时间，把callback执行的时候，就会把之前准备的params传递给它」！
for (var i = 0; i < 5; i++) {
    setTimeout(function (i) {
        console.log(i);
    }, (i + 1) * 1000, i);
}
// 第一轮  setTimeout(function(i){ console.log(i); },1000,0)
// 第二轮  setTimeout(function(i){ console.log(i); },2000,1)
// ...... */